package com.company.exception;

import com.sun.xml.internal.fastinfoset.tools.FI_DOM_Or_XML_DOM_SAX_SAXEvent;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
* 1、将可能抛出FileNotFoundException 文件不存在异常的代码放在try里
* 2、如果文件存在，就会顺序往下执行，并且不执行catch块中的代码
* 3、如果文件不存在， try里面的代码就会立即终止，程序流程会运行到对应的catch块中。
* 4、e.printStackTrace()；会打印出方法的调用痕迹，如此列，
* 会打印出异常开始于TestException的第16行，这样就便于定位和分析到底是哪里出了异常。
* */
public class testException {
    public static void main(String[] args) {
        // 代码的异常捕捉------------------------------------------
//        File f = new File("d:/LOL.exe");
//        try {
//            System.out.println("试图打开 d:/LOL.exe");
//            new FileInputStream(f);
//            System.out.println("成功打开");
//
//        }
//        catch(FileNotFoundException e){
//            System.out.println("d:/LOL.exe不存在");
//            e.printStackTrace();
//            System.out.println("结束");
//        }

        //使用异常的父类进行catch-------------------------------------
        //FileNotFundException是Exception的子类，使用Exception也可以catch住FileNotFoundException
//        File file = new File("d:/LOL.exe");
//        try {
//            System.out.println("试图打开 d:/LOL.exe");
//            new FileInputStream(file);
//            System.out.println("成功打开");
//        } catch(Exception e){
//            System.out.println("d:/LOL.exe");
//            e.printStackTrace();
//        }

        //多异常捕捉方法------------------------------------------
//        File file = new File("d:/LOL.exe");
//
//        try {
//            System.out.println("试图打开d:/LOL.exe");
//            new FileInputStream(file);
//            System.out.println("成功打开");
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//            Date d = sdf.parse("2016-09-03");
//        }   catch (FileNotFoundException e) {
//            System.out.println("d:/LOL.exe不存在");
//            e.printStackTrace();
//        }catch (ParseException e){
//            System.out.println("日期格式解析错误");
//            e.printStackTrace();
//        }
        // 多异常捕获第二种方法
        //把多个异常，放在一个catch里统一捕捉-------------------------------------
//        File file = new File("d:/LOL.exe");
//        try {
//            System.out.println("试图打开 d:/LOL.exe");
//            new FileInputStream(file);
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//            Date d = sdf.parse("2016-09-03");
//        } catch (FileNotFoundException | ParseException e){
//            if (e instanceof FileNotFoundException)
//                System.out.println("d:/LOL.exe 文件不存在");
//            if (e instanceof ParseException)
//                System.out.println("日期格式解析错误");
//        }
//      无论是否出现异常， finally中的代码都会执行---------------------------------
//        File file = new File("d:/LOL.exe");
//        try {
//            System.out.println("试图打开d:/LOL.exe");
//            new FileInputStream(file);
//            System.out.println("成功打开");
//        }catch (FileNotFoundException e){
//            System.out.println("d:/LOL.exe 文件不存在");
//        }
//        finally {
//            System.out.println("无论文件存不存在， 都会执行的代码");
//        }

        /*
        * throws
        * 考虑如下情况:
        *   主方法调用method1
        *   method1调用method2
        *   method2中打开文件
        * method2中需要进行异常处理
        * 但是method2不打算处理，而是把这个异常通过throws抛出去。
        * 那么method1就会街道异常，处理办法也是两种， 要么是try catch处理掉，要么也是抛出去。
        * method1选择本地try catch住 一旦try catch住了，就相当于把这个异常消化掉。
        * 主方法在调用method1的时候，就不需要进行异常处理了
        * */
        method1();

    }

    private static void method1(){
        try{
            method2();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static void method2() throws FileNotFoundException{
        File file = new File("d:/LOL.exe");
        System.out.println("试图打开 d:/LOL.exe");
        new FileInputStream(file);
        System.out.println("成功打开");
    }
    /*
    * throws 和 throw的区别
    *   throws出现在方法的声明上， 而throw通常都出现在方法体内。
    *   throws表示出现异常的一种可能性，并不一定发生这些异常。、
    *   throw则是抛出了异常，执行throw则一定抛出了某个异常对象。
    * */
}
